<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  
  <title>springcloud之config分布式配置中心 | rongshen</title>
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
  
  
  
<link rel="stylesheet" href="/css/style.css">

  
    
<link rel="stylesheet" href="/css/highlight.css">

  
  <meta name="description" content="springcloud学习笔记，第8章，Config微服务配置中心">
<meta property="og:type" content="article">
<meta property="og:title" content="springcloud之config分布式配置中心">
<meta property="og:url" content="http://example.com/2020/09/29/springcloud%E4%B9%8Bconfig%E5%88%86%E5%B8%83%E5%BC%8F%E9%85%8D%E7%BD%AE%E4%B8%AD%E5%BF%83/index.html">
<meta property="og:site_name" content="rongshen">
<meta property="og:description" content="springcloud学习笔记，第8章，Config微服务配置中心">
<meta property="og:locale" content="en_US">
<meta property="og:image" content="http://cdn.rongshen2020.com/2020929a1.png">
<meta property="og:image" content="http://cdn.rongshen2020.com/2020929a2.png">
<meta property="og:image" content="http://cdn.rongshen2020.com/2020929a3.png">
<meta property="og:image" content="http://cdn.rongshen2020.com/2020929a4.png">
<meta property="og:image" content="http://cdn.rongshen2020.com/2020929a5.png">
<meta property="og:image" content="http://cdn.rongshen2020.com/2020929a6.png">
<meta property="og:image" content="http://cdn.rongshen2020.com/2020929a7.png">
<meta property="og:image" content="http://cdn.rongshen2020.com/2020929a8.png">
<meta property="og:image" content="http://cdn.rongshen2020.com/2020929a9.png">
<meta property="og:image" content="http://cdn.rongshen2020.com/2020929a10.png">
<meta property="og:image" content="http://cdn.rongshen2020.com/2020929a11.png">
<meta property="og:image" content="http://cdn.rongshen2020.com/2020929a12.png">
<meta property="article:published_time" content="2020-09-29T07:33:51.000Z">
<meta property="article:modified_time" content="2021-05-07T06:49:30.373Z">
<meta property="article:author" content="John Doe">
<meta property="article:tag" content="springCloud">
<meta name="twitter:card" content="summary">
<meta name="twitter:image" content="http://cdn.rongshen2020.com/2020929a1.png"><meta name="generator" content="Hexo 6.1.0"></head>

<body>
  <div id="wrapper">
    <header id="header">
  <h1 id="title">
    <a href="/">rongshen</a>
  </h1>
  <nav>
    
    
      
      <a class="nav-link" href="/">Home</a>
    
      
        <span class="nav-spacer">×</span>
      
      <a class="nav-link" href="/archives">Archives</a>
    
      
        <span class="nav-spacer">×</span>
      
      <a class="nav-link" target="_blank" rel="noopener" href="https://github.com/Aaron-boom">Github</a>
    
      
        <span class="nav-spacer">×</span>
      
      <a class="nav-link" href="/2020/04/13/About-Me/">About</a>
    
    
  </nav>
</header>

    <div id="content">
      <article id="post-springcloud之config分布式配置中心" class="article article-type-post" itemprop="blogPost" itemscope>
  <div class="article-inner">
    
      <header class="article-header">
        
  
    <h2 class="article-title" itemprop="headline name">
      springcloud之config分布式配置中心
    </h2>
  


        <div class="article-meta">
          <time class="article-date" datetime="2020-09-29T07:33:51.000Z" itemprop="datePublished">2020-09-29</time>

          
        </div>
      </header>
    
    <div class="article-entry" itemprop="articleBody">
      
      
        <blockquote>
<p>springcloud学习笔记，第8章，Config微服务配置中心</p>
</blockquote>
<span id="more"></span>


<h2 id="简介："><a href="#简介：" class="headerlink" title="简介："></a>简介：</h2><h3 id="分布式系统面临的配置问题："><a href="#分布式系统面临的配置问题：" class="headerlink" title="分布式系统面临的配置问题："></a>分布式系统面临的配置问题：</h3><p>微服务意味着要将单体应用中的业务拆分成一个个子服务，每个服务的颗粒度相对较小，因此系统中会出现大量的服务。由于每个服务都需要必要的配置信息才能运行，所以一套集中式的、动态的配置管理设施是必不可少的。</p>
<p>springcloud提供了configServer来解决这个问题，我们每一个微服务自己带一个application.yml，那么上百个配置文件的管理就是一个大问题了。</p>
<p>就像我们之前学的：可以看到,每个微服务都需要一个配置文件,并且,如果有几个微服务都需要连接数据库。那么就需要配4次数据库相关配置,并且当数据库发生改动,那么需要同时修改4个微服务的配置文件才可以。</p>
<h3 id="是什么？"><a href="#是什么？" class="headerlink" title="是什么？"></a>是什么？</h3><p><img src="http://cdn.rongshen2020.com/2020929a1.png"></p>
<p>springcloud config为微服务架构中的微服务提供集中化的外部配置支持，配置服务器为各个不同微服务应用的所有环境提供一个中心化的外部配置。</p>
<p><img src="http://cdn.rongshen2020.com/2020929a2.png"></p>
<h3 id="能干嘛？"><a href="#能干嘛？" class="headerlink" title="能干嘛？"></a>能干嘛？</h3><ol>
<li><p>集中管理配置文件</p>
</li>
<li><p>不同环境不同配置，动态化的配置更新，分环境部署比如dev&#x2F;test&#x2F;prod&#x2F;beta&#x2F;release</p>
</li>
<li><p>运行期间动态调整配置，不在需要在每个服务部署的机器上编写配置文件，服务会向配置中心统一拉取配置自己的信息</p>
</li>
<li><p>当配置发生变动时，服务不需要重启即可感知到配置的变化并应用新的配置</p>
</li>
<li><p>将配置信息以REST接口的形式暴露，post&#x2F;curl访问刷新即可</p>
</li>
</ol>
<h2 id="Config服务端配置与测试："><a href="#Config服务端配置与测试：" class="headerlink" title="Config服务端配置与测试："></a>Config服务端配置与测试：</h2><ol>
<li><p>使用github作为配置中心的仓库：</p>
<ul>
<li><p>在github上创建一个配置中心仓库，注意得是公共仓库。不然会有密码问题。</p>
</li>
<li><p>从github上将仓库代码拷贝至本地</p>
</li>
</ul>
</li>
<li><p>新建config模块：</p>
<p><code>cloud-config-center-3344</code>，它即为cloud的配置中心模块cloudConfig Center。</p>
</li>
<li><p>pom：</p>
<pre><code class="java">&lt;!--config--&gt;
&lt;dependency&gt;
    &lt;groupId&gt;org.springframework.cloud&lt;/groupId&gt;
    &lt;artifactId&gt;spring-cloud-config-server&lt;/artifactId&gt;
&lt;/dependency&gt;
&lt;!--eureka client--&gt;
&lt;dependency&gt;
    &lt;groupId&gt;org.springframework.cloud&lt;/groupId&gt;
    &lt;artifactId&gt;spring-cloud-starter-netflix-eureka-client&lt;/artifactId&gt;
&lt;/dependency&gt;
&lt;!--web--&gt;
&lt;dependency&gt;
    &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
    &lt;artifactId&gt;spring-boot-starter-web&lt;/artifactId&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
    &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
    &lt;artifactId&gt;spring-boot-starter-actuator&lt;/artifactId&gt;
&lt;/dependency&gt;
&lt;!--一般基础通用配置--&gt;
&lt;dependency&gt;
    &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
    &lt;artifactId&gt;spring-boot-devtools&lt;/artifactId&gt;
    &lt;scope&gt;runtime&lt;/scope&gt;
    &lt;optional&gt;true&lt;/optional&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
    &lt;groupId&gt;org.projectlombok&lt;/groupId&gt;
    &lt;artifactId&gt;lombok&lt;/artifactId&gt;
    &lt;optional&gt;true&lt;/optional&gt;
&lt;/dependency&gt;
&lt;dependency&gt;
    &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;
    &lt;artifactId&gt;spring-boot-starter-test&lt;/artifactId&gt;
    &lt;scope&gt;test&lt;/scope&gt;
&lt;/dependency&gt;
</code></pre>
</li>
<li><p>配置文件YML：</p>
<pre><code class="java">server:
  port: 3344

spring:
  application:
    name: cloud-config-center
  cloud:
    config:
      server:
        git:
          uri: https://github.com/Aaron-boom/springcloud-config.git # git@github.com:Aaron-boom/springcloud-config.git,测试不通git的,使用https的。https://github.com/Aaron-boom/springcloud-config.git
          search-paths:
            - springcloud-config
      label: master

eureka:
  client:
    service-url:
      defaultZone: http://localhost:7001/eureka
</code></pre>
</li>
<li><p>主启动类注解：</p>
<pre><code class="java">@EnableEurekaClient
@EnableConfigServer
</code></pre>
</li>
<li><p>修改hosts（可选）：</p>
<p>windows下修改host文件的映射，可以使用主机名进行访问。</p>
</li>
<li><p>配置完成：</p>
<p>启动eureka7001和config3344</p>
<p><img src="http://cdn.rongshen2020.com/2020929a3.png"></p>
</li>
<li><p>读取配置文件的3种规则：</p>
<ul>
<li>第一种</li>
</ul>
<p><img src="http://cdn.rongshen2020.com/2020929a4.png"></p>
<ul>
<li>第二种</li>
</ul>
<p><img src="http://cdn.rongshen2020.com/2020929a5.png"></p>
<ul>
<li>第三种</li>
</ul>
<p><img src="http://cdn.rongshen2020.com/2020929a6.png"></p>
<ul>
<li><p>总结：</p>
<p><img src="http://cdn.rongshen2020.com/2020929a7.png"></p>
</li>
</ul>
</li>
</ol>
<h2 id="Config客户端配置与测试："><a href="#Config客户端配置与测试：" class="headerlink" title="Config客户端配置与测试："></a>Config客户端配置与测试：</h2><p>使用3355客户端去访问3344服务端的配置信息。</p>
<ol>
<li><p>创建Config客户端项目：<code>cloud-config-client-3355</code></p>
</li>
<li><p>pom：</p>
<pre><code class="java">&lt;!--config的客户端--&gt;
&lt;dependency&gt;
    &lt;groupId&gt;org.springframework.cloud&lt;/groupId&gt;
    &lt;artifactId&gt;spring-cloud-starter-config&lt;/artifactId&gt;
&lt;/dependency&gt;
&lt;!--eureka client--&gt;
&lt;dependency&gt;
    &lt;groupId&gt;org.springframework.cloud&lt;/groupId&gt;
    &lt;artifactId&gt;spring-cloud-starter-netflix-eureka-client&lt;/artifactId&gt;
&lt;/dependency&gt;
</code></pre>
</li>
<li><p>配置文件：</p>
<ul>
<li><p>bootstrap.yml是什么：</p>
<p><img src="http://cdn.rongshen2020.com/2020929a8.png"></p>
</li>
<li><p>内容：</p>
<pre><code class="java">server:
  port: 3355

spring:
  application:
    name: config-client
  cloud:
    config:
      label: master # 分支名称
      name: config # 配置文件名称
      profile: dev # 读取后缀名称 上述三个综合：master分支上config-dev.yml的配置文件被读取为http://config-3344.com/master/conf
      uri: http://localhost:3344 # 配置中心地址

eureka:
  client:
    service-url:
      defaultZone: http://localhost:7001/eureka
</code></pre>
</li>
</ul>
</li>
<li><p>主启动类：</p>
<pre><code class="java">@SpringBootApplication
@EnableEurekaClient
public class ConfigClientMain3355 &#123;
    public static void main(String[] args) &#123;
        SpringApplication.run(ConfigClientMain3355.class, args);
    &#125;
&#125;
</code></pre>
</li>
<li><p>controller类：</p>
<pre><code class="java">@RestController
public class ConfigClientController &#123;
    @Value(&quot;$&#123;config.info&#125;&quot;)
    private String configInfo;

    @GetMapping(&quot;/configInfo&quot;)
    public String getConfigInfo()&#123;
        return configInfo;
    &#125;
&#125;
</code></pre>
</li>
<li><p>测试：</p>
</li>
</ol>
<p><img src="http://cdn.rongshen2020.com/2020929a9.png"></p>
<ul>
<li>注意，读取的是config的info信息。</li>
</ul>
<h2 id="Config客户端之动态刷新："><a href="#Config客户端之动态刷新：" class="headerlink" title="Config客户端之动态刷新："></a>Config客户端之动态刷新：</h2><p>上面3355确实获取到了配置文件,但是如果此时配置文件修改了,3355是获取不到的。3344可以实时获取到最新配置文件,但是3355却获取不到，除非重启服务。</p>
<p><img src="http://cdn.rongshen2020.com/2020929a10.png"></p>
<p>springcloud bus配合springcloud config使用可以实现配置的动态刷新~</p>
<ol>
<li><p>修改3355模块</p>
</li>
<li><p>POM引入actuator监控</p>
</li>
<li><p>修改Yml，暴露监控端口</p>
<pre><code class="java">management:
  endpoints:
    web:
      exposure:
        include: &quot;*&quot;
</code></pre>
</li>
<li><p><code>@RefreshScope</code>业务类Controller修改</p>
<p><img src="http://cdn.rongshen2020.com/2020929a11.png"></p>
</li>
<li><p>此时再修改github–》3344–》3355，再次测试：</p>
<ol>
<li><code>http://localhost:3344/master/config-dev.yml</code></li>
<li><code>http://localhost:3355/configInfo</code></li>
<li>这里是没有生效的，3344访问到变化了，3355没有访问到</li>
</ol>
</li>
<li><p>补救</p>
<ul>
<li>需要运维人员发送post请求（必须是post）刷新3355。</li>
</ul>
<p><img src="http://cdn.rongshen2020.com/2020929a12.png"></p>
<ul>
<li>此时再访问：<code>http://localhost:3355/configInfo</code>成功修改。</li>
</ul>
</li>
</ol>
<p><strong>此时新的问题又出现了，就是：</strong></p>
<ol>
<li>假如有多个微服务客户端。。。。怎么可能去手动刷新？每个微服务都post请求一次？</li>
<li>可否广播。一次通知，处处生效？</li>
<li>我们想大范围的刷新，怎么办？</li>
</ol>
<h3 id="其实这就是下一章笔记要讲的，使用springcloud-bus配合springcloud-config使用可以实现配置的动态刷新"><a href="#其实这就是下一章笔记要讲的，使用springcloud-bus配合springcloud-config使用可以实现配置的动态刷新" class="headerlink" title="其实这就是下一章笔记要讲的，使用springcloud bus配合springcloud config使用可以实现配置的动态刷新~"></a>其实这就是下一章笔记要讲的，使用springcloud bus配合springcloud config使用可以实现配置的动态刷新~</h3>
      
    </div>
    
    
    <div class="article-category">
      
        <b>Categories:</b>
        <a class="article-category-link" href="/categories/spring-cloud/">spring cloud</a>
      
      
        <br/>
      
      
        <b>Tags:</b>
        <a class="article-tag-none-link" href="/tags/springCloud/" rel="tag">springCloud</a>
      
    </div>
    
    
  </div>
</article>

  
<nav id="article-nav" class="article-nav">
  
    <a href="/2020/09/30/springcloud%E4%B9%8Bbus%E5%BE%AE%E6%9C%8D%E5%8A%A1%E6%B6%88%E6%81%AF%E6%80%BB%E7%BA%BF/" id="article-nav-newer" class="article-nav-link-wrap newer">
      <strong class="article-nav-caption">Newer</strong>
      <div class="article-nav-title">
        
          springcloud之bus微服务消息总线
        
      </div>
    </a>
  
  
    <a href="/2020/09/28/springcloud%E4%B9%8BGateway/" id="article-nav-older" class="article-nav-link-wrap older">
      <strong class="article-nav-caption">Older</strong>
      <div class="article-nav-title">
        
          springcloud之Gateway
        
      </div>
    </a>
  
</nav>






    </div>
  </div>
  




<div id="settings-container">
  <div id="dark-mode">dark</div>
  <div id="sans-font">sans</div>
</div>
<script type="text/javascript">
let d=document,r=d.documentElement.style,f=r.setProperty.bind(r),l=localStorage,s=l.getItem('s')||(window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches),n=l.getItem('n'),m=d.getElementById("dark-mode"),b=()=>{f('--bg-color','#fafafa');f('--code-bg-color','#f4f4f4');f('--text-color','#212121');f('--secondary-color','#808080');f('--tertiary-color','#b0b0b0');f('--link-color','#b5c8cf');f('--link-hover-color','#618794');f('--link-bg-color','#dae4e7');f('--selection-color','#dae4e7');m.innerHTML="dark"},c=()=>{f('--bg-color','#212121');f('--code-bg-color','#292929');f('--text-color','#fff');f('--secondary-color','#c0c0c0');f('--tertiary-color','#6e6e6e');f('--link-color','#4d6b75');f('--link-hover-color','#96b1bb');f('--link-bg-color','#5d828e');f('--selection-color','#acc1c9');m.innerHTML="light"},o=d.getElementById("sans-font"),e=()=>{f('--body-stack','"Lora", "Georgia", "Times New Roman", serif');o.innerHTML="sans"},g=()=>{f('--body-stack','"Lato", "Lucida Grande", "Lucida Sans Unicode", "Lucida Sans", "Verdana", sans-serif');o.innerHTML="serif"};m.onclick=()=>{if(s==2){s=1;l.setItem('s',s);c()}else{s=2;l.setItem('s',s);b()}};o.onclick=()=>{if(n==2){n=1;l.setItem('n',n);g()}else{n=2;l.setItem('n',n);e()}};if(!s){s=2;l.setItem('s',2)};if(s==1){c()};if(!n){n=2;l.setItem('n',2)};if(n==1){g()};
</script>




</body>
</html>
